import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 模拟市场收益率和个股收益率
np.random.seed(42)
n_obs = 60
market_return = np.random.normal(0.0008, 0.015, n_obs)
beta = 1.2
alpha = 0.0002
stock_return = alpha + beta * market_return + np.random.normal(0, 0.01, n_obs)
# 绘制证券特征线
plt.figure(figsize=(10, 6))
plt.scatter(market_return, stock_return,
s=80, alpha=0.6, color='#2E86AB', edgecolors='white')
# 添加拟合线
z = np.polyfit(market_return, stock_return, 1)
p = np.poly1d(z)
x_line = np.linspace(market_return.min(), market_return.max(), 100)
plt.plot(x_line, p(x_line), 'r-', linewidth=2.5, label='证券特征线(SML)')
# 添加理论线(alpha=0)
plt.plot(x_line, beta * x_line, 'g--', linewidth=2, alpha=0.7, label='理论线(α=0)')
plt.xlabel('市场收益率 $R_m$', fontsize=12)
plt.ylabel('股票收益率 $R_i$', fontsize=12)
plt.title(f'CAPM模型: β={beta:.2f}, α={alpha:.4f}', fontsize=16, fontweight='bold')
plt.legend(fontsize=11)
plt.grid(True, alpha=0.3)
plt.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
plt.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
plt.tight_layout()
plt.show()
# 统计量
correlation = np.corrcoef(market_return, stock_return)[0, 1]
r_squared = correlation ** 2
print(f'Beta (β): {z[0]:.2f}')
print(f'Alpha (α): {z[1]:.4f}')
print(f'R²: {r_squared:.4f}')